//
//  WBNetworkManager.swift
//  仿微博
//
//  Created by apple on 2016/12/20.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import AFNetworking


///Swift 中枚举支持任意数据类型
///switch /enum  在OC中都只是支持整数
enum WBHTTPmetod {
  case GET
  case POST



}
/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    
   /// 静态区/常量/闭包
  /// 在第一次访问时，并将结果保存在 shared中
    static let shared = { ()->WBNetworkManager in
        
    
    let instance = WBNetworkManager()
        
        //设置响应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        //返回对象
        return instance
    
    
    }

    
      // 用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
//    /// 访问令牌， 所有网络请求，都基于此令牌（登录除外）
//    
//    var accessToken: String? //= "2.00QHILeG9f7ElD3b85c8d0dbGTwWzB"
//    // 用户微博 uid
//    var uid: String? = "6090503242"
    // 用户登录标记  【计算型属性】
    var userLogon: Bool {
     return userAccount.access_token != nil
    
    }
    ///专门负责  token的网络请求方法
    ///为了保护用户安全， token 是有时间限制的 ，默认是三天
    func tokenRequest(method: WBHTTPmetod = .GET, URLString: String, parameters: [String: AnyObject]?, competion:  @escaping (_ json: AnyObject?, _ isSuccess: Bool)->())  {
        
        //处理  token字典
        // 0> 判断  token 是否为 nil  ，为 nil 直接返回
        guard  let token = userAccount.access_token else {
             //  发送通知， 提示用户再次登录
            print("没有 ！需要登录")
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            competion(nil, false)
            return
        }
        
        // 1>判断  参数字典是否为空  ，如果为 nil 创建一个新的
        var parameters = parameters
        
        if parameters == nil {
        //实例化字典
            parameters = [String: AnyObject]()
        
        }
        // 2> 设置参数字典， 代码在此处字典一定有值
        
        parameters!["access_token"] = token as AnyObject?
        ///调用  request 发起真正的网络请求
        request(URLString: URLString, parameters: parameters, competion: competion)
        
    }
    /// 使用一个函数封装  AFN 的 GET/POST 请求
    ///
    /// - Parameters:
    ///   - method:     GET/POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - competion: 完成回调【json（字典/数组）， 是否成功】
    func request(method: WBHTTPmetod = .GET, URLString: String, parameters: [String: AnyObject]?, competion:  @escaping (_ json: AnyObject?, _ isSuccess: Bool)->()){
        
        /// 成功回调
        let success = {(task: URLSessionDataTask, json: Any?) in
            competion(json as AnyObject?, true)
         
        }
        
        /// 失败对回调
        let failure = {(task: URLSessionDataTask?, error: Error) in
            //针对  403  token 过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
            print("Token 过期")
                // FIXME: 发送通知， 提示用户再次登录（本方法 不知道被谁调用，谁接到通知，谁处理）
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
            }
            print("网络请求错误\(error)")
            competion(nil, false)
            
        }
        
        if method == .GET {
      
        get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        else{
        post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        
        }
        
        
        
    }
  
    
    
    
    
    
    
    
}
